import java.util.*;

public class solution {
//    public int firstUniqChar(String s) {
//        Set<Character> set = new HashSet<>();
//        char[] chars = new char[s.length()];
//        for(int i = 0; i < s.length(); i++) {
//            if(set.contains(s.charAt(i))) {
//                chars[i] = s.charAt(i);
//            }
//            set.add(s.charAt(i));
//        }
//        String temp = Arrays.toString(chars);
//        for(int i = 0; i < s.length(); i++) {
//            if(temp.indexOf(s.charAt(i)) == -1) {
//                return i;
//            }
//        }
//        return -1;
//    }
//  通过集合将重复的出现的字符存到一个新的字符数组中，然后转为String后，在这个String中遍历查找，原String的每一个字符
//  找不到就说明是唯一字符，返回其下标

//通过哈希表来存储出现次数
    public int firstUniqChar(String s) {
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        for (int i = 0; i < s.length(); i++) {
            if (map.get(s.charAt(i)) == 1) {
                return i;
            }
        }
        return -1;
    }
//题中s由26个小写字符构成，可以利用数组映射
    public int firstUniqChar1(String s) {
        int[] array = new int[26];
        for (int i = 0; i < s.length(); i++) {
            array[s.charAt(i)-'a']++;
        }
        for (int i = 0; i < s.length(); i++) {
            if (array[s.charAt(i)-'a'] == 1) {
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        String str = "hhellodawdad";
        System.out.println(new solution().firstUniqChar(str));
    }
}
